﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Sql;
using System.Data;
using DAL;
using System.ComponentModel;
using System.Transactions;
using UtilityExtensions;

namespace BOL
{

    [Serializable]
    public class NotaIngresoBL
    {

        public NotaIngresoBL()
        {
            //DAL.Menu notaIngresoRead = DbUtil.Db.Menus.Single(p => p.idInternal == 108);
            //DAL.Menu notaIngresoEdit = DbUtil.Db.Menus.Single(p => p.idInternal == 110);

        }

        private DAL.Menu notaIngresoRead = DbUtil.Db.Menus.Single(p => p.idInternal == 108);
        private DAL.Menu notaIngresoEdit = DbUtil.Db.Menus.Single(p => p.idInternal == 110);
        private DAL.Menu ordenCompraRead = DbUtil.Db.Menus.Single(p => p.idInternal == 106);
        private DAL.Menu ordenGastoRead = DbUtil.Db.Menus.Single(p => p.idInternal == 107);

        private void verificacierreKardex(dbGestionDataContext _db,DateTime fecha,int idAlmacen)
        {
            var q = from a in _db.SaldoKardexes
                    where
                    a.idAlmacen == idAlmacen
                    & a.anio == fecha.Year
                    & a.mes == fecha.Month
                    select a;

            if (q.Count() > 0)
            {
                throw new Exception("Existe Cierre de Kardex");
            }
        }

        public int Add(
            int? idProveedor,
            string descripcion,
            string documentoRef,
            int documentoTipo,
            int idAlmacen,
            DateTime fecha,
            DateTime fechaDoc,
            int idMotivo,
            string observaciones,
            int idObra,
            int idOrigen,
            decimal? tipoCambioDollar,
            DataSet dsColeccion)
        {

            
            using (TransactionScope ts = new TransactionScope())
            {
                dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString);
                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

                //--------------------
                bool acceso = new FormularioAcceso().VerificarAcceso(_db,
                    idEmpleadoEmisor,
                    5, //Nota Ingreso
                    idObra,
                    2); //creacion
                //-------------------------     

                if (documentoRef == String.Empty)
                {
                    throw new Exception("No existe  informacion de documento de Referencia");
                }

                //valida fecha de cierre 

                verificacierreKardex(_db,fecha,idAlmacen);
                

                

                NotaIngreso ni = new NotaIngreso();
                ni.Add(_db,
                    idProveedor,
                    ni.getCorrelativo(_db, idAlmacen),
                    descripcion,
                    documentoRef,
                    documentoTipo,
                    idAlmacen,
                    fecha,
                    fechaDoc,
                    idMotivo,
                    observaciones,
                    idEmpleadoEmisor,
                    idObra,
                    idOrigen,
                    tipoCambioDollar);

                NotaIngresoItemInfo iteminfo = new NotaIngresoItemInfo();


                if (dsColeccion.Tables[iteminfo.GetType().Name].Rows.Count == 0)
                {
                    throw new Exception("Debe existir items en la Nota de Ingreso");
                }

                foreach (DataRow item in dsColeccion.Tables[iteminfo.GetType().Name].Rows)
                {

                    if (item.RowState == DataRowState.Added)
                    {

                        iteminfo = (NotaIngresoItemInfo)UtilityExtensions.Util.DataRowToEntidad(item,
                                                              iteminfo.GetType());

                        NotaIngresoItem nitem = new NotaIngresoItem();
                        int idMoneda = 3;//todo es en soles
                        nitem.Add(_db,
                            ni.idInternal,
                            iteminfo.idInsumo,
                            iteminfo.cantidad,
                            iteminfo.cantidadOrig,
                            iteminfo.idRefItem,
                            idOrigen,
                            iteminfo.DescripcionRef,
                            idMoneda,
                            iteminfo.idRefNotaItem);
                        // para las que bienen de ordenes de  compra

                        if (idMotivo == 1) //compra
                        {
                            OrdenCompraItem ocItem =
                                _db.OrdenCompraItems.Single(p => p.idInternal == iteminfo.idRefItem);
                            ocItem.updateCantRecepcion(_db);
                          
                            //tipo de cambio del comparativo
                            OrdenCompra comp=ocItem.OrdenCompra;
                            //precio unit soles     si es dol se cambia a sol
                            decimal precioUnitSoles = ocItem.precioNoIGV.Value * comp.tipoCambio.Value;

                            // para los cambio de moneda segun comparativo
                            Moneda monedadoll=_db.Monedas.Single(p=>p.idInternal==4);
                            tipoCambioDollar = monedadoll.getTipoCambio(_db, comp.fechaEmision.Value);

                            //precio soles y tipo de cambio
                            nitem.UpdatePrecioYTipoCambioDoll(_db,
                                                               precioUnitSoles, 
                                                               tipoCambioDollar.Value);
                               
                        }
                        if (idMotivo == 2)  //ajuste
                        {

                            nitem.UpdatePrecioYTipoCambioDoll(_db,
                                  iteminfo.PrecioUnit, tipoCambioDollar.Value);

                        }
                        if (idMotivo == 11) //nota de credito
                        {
                            OrdenCompraItem ocItem =
                                _db.OrdenCompraItems.Single(p => p.idInternal == iteminfo.idRefItem);
                            ocItem.updateCantRecepcion(_db);

                            //tipo de cambio del comparativo
                            OrdenCompra comp = ocItem.OrdenCompra;
                            //precio unit soles
                            decimal precioUnitSoles = ocItem.precioNoIGV.Value * comp.tipoCambio.Value;

                            // para los cambio de moneda segun comparativo
                            Moneda monedadoll = _db.Monedas.Single(p => p.idInternal == 4);
                            tipoCambioDollar = monedadoll.getTipoCambio(_db, comp.fechaEmision.Value);


                            nitem.UpdatePrecioYTipoCambioDoll(_db,
                               precioUnitSoles, tipoCambioDollar.Value);

                        }

                         if (idMotivo == 13) //ingreso por transferencia
                        {
                            NotaSalidaItem ocItem =
                                _db.NotaSalidaItems.Single(p => p.idInternal == iteminfo.idRefNotaItem);
                                ocItem.SetCantRecepcion(_db);

                                // para los cambio de moneda segun comparativo
                                Moneda monedadoll = _db.Monedas.Single(p => p.idInternal == 4);
                                tipoCambioDollar = monedadoll.getTipoCambio(_db, fecha);


                                nitem.UpdatePrecioYTipoCambioDoll(_db,
                                     iteminfo.PrecioUnit, tipoCambioDollar.Value);

                             //calculo para el precio de lo ingresado por nota de salida
                             
                               
                        }
                        

                    }
                }


               


                ts.Complete();
                return ni.idInternal;

            }
        }


        
        

  

        public void Update(
            int idNotaIngreso,
            string documentoRef,
            int documentoTipo,
            DateTime fecha,
            string observaciones,
            DataSet dsColeccion)
        {

            //using (TransactionScope ts = new TransactionScope())
            //{
            //    dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString);
            //    int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

            //    NotaIngreso ni = _db.NotaIngreso.Single(p => p.idInternal == idNotaIngreso);
            //    ni.Update(_db,
            //        documentoRef,
            //        documentoTipo,
            //        fecha,
            //        observaciones,
            //        idEmpleadoEmisor);

            //    NotaIngresoItemInfo iteminfo = new NotaIngresoItemInfo();

            //    foreach (DataRow item in dsColeccion.Tables[iteminfo.GetType().Name].Rows)
            //    {

            //        if (item.RowState == DataRowState.Added)
            //        {
            //            iteminfo = (NotaIngresoItemInfo)Util.DataRowToEntidad(item,
            //                                                  iteminfo.GetType());
            //            NotaIngresoItem nitem = new NotaIngresoItem();
            //            nitem.Add(_db,
            //                ni.idInternal,
            //                iteminfo.idInsumo,
            //                iteminfo.cantidad,
            //                iteminfo.cantidadOrig,
            //                iteminfo.idRefItem,
            //                iteminfo.idOrigen,
            //                iteminfo.DescripcionRef,
            //                iteminfo.PrecioUnit,
            //                iteminfo.idMoneda,
            //                item);
            //            // para las que bienen de ordenes de  compra
            //            if (iteminfo.idOrigen == 1)
            //            {
            //                OrdenCompraItem ocItem =
            //                    _db.OrdenCompraItems.Single(p => p.idInternal == iteminfo.idRefItem);
            //                ocItem.updateCantRecepcion(_db);

            //            }
            //        }
            //        if (item.RowState == DataRowState.Modified)
            //        {
            //            iteminfo = (NotaIngresoItemInfo)Util.DataRowToEntidad(item,
            //                                                  iteminfo.GetType());
            //            NotaIngresoItem nitem = _db.NotaIngresoItem.Single(p => p.idInternal == iteminfo.idinternal);
            //            nitem.Update(_db,
            //                iteminfo.cantidadOrig,
            //                iteminfo.cantidad);
            //            // para las que bienen de ordenes de  compra
            //            if (iteminfo.idOrigen == 1)
            //            {
            //                OrdenCompraItem ocItem =
            //                    _db.OrdenCompraItems.Single(p => p.idInternal == iteminfo.idRefItem);
            //                ocItem.updateCantRecepcion(_db);

            //            }
            //        }
            //        if (item.RowState == DataRowState.Deleted)
            //        {
            //            item.RejectChanges();
            //            iteminfo = (NotaIngresoItemInfo)Util.DataRowToEntidad(item,
            //                                                  iteminfo.GetType());
            //            NotaIngresoItem nitem = _db.NotaIngresoItem.Single(p => p.idInternal == iteminfo.idinternal);
            //            _db.NotaIngresoItem.DeleteOnSubmit(nitem);
            //            _db.SubmitChanges();
            //            // para las que bienen de ordenes de  compra
            //            if (iteminfo.idOrigen == 1)
            //            {
            //                OrdenCompraItem ocItem =
            //                    _db.OrdenCompraItems.Single(p => p.idInternal == iteminfo.idRefItem);
            //                ocItem.updateCantRecepcion(_db);

            //            }
            //        }
            //    }
            //    ts.Complete();
            //    return ni.idInternal;

            //    }
            //}
        }

        public bool Delete(int idNotaingreso)
        {
            using (TransactionScope ts= new TransactionScope())
         {
             bool result = false;
            using (dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString))
            {


                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                NotaIngreso ni = _db.NotaIngresos.Single(p => p.idInternal == idNotaingreso);

                //valida fecha de cierre 
                //--------------------
                bool acceso = new FormularioAcceso().VerificarAcceso(_db,
                    idEmpleadoEmisor,
                    5, //Nota Ingreso
                    ni.Almacen.idObra.Value,
                    4); //creacion
                //-------------------------  

                verificacierreKardex(_db, ni.fecha.Value, ni.idAlmacen);

                var q=from a in _db.NotaIngresoItems
                      where a.idNotaIngreso==idNotaingreso
                      select  a;

                      foreach (var item in q)
                      {

                          _db.NotaIngresoItems.DeleteOnSubmit(item);
                          _db.SubmitChanges();
                          //caso  que pertence a la orden de compra
                          if (item.idOrigen == 1)
                          {
                              // solo podra  anularse si no se encuentra facturado
                              
                              OrdenCompraItem ocItem =
                                  _db.OrdenCompraItems.Single(p => p.idInternal == item.idRefItem);
                              if (ocItem.OrdenCompra.idEstado==30) //facturado
                              {
                                  throw new Exception(String.Format("La Orden de Compra:{0} se encuentra facturado ",ocItem.OrdenCompra.numDocumento));
                              }
                              ocItem.updateCantRecepcion(_db);


                          }
                          if (item.idOrigen == 13)
                          {
                              
                              NotaSalidaItem ocItem =
                                  _db.NotaSalidaItems.Single(p => p.idInternal == item.idRefNotaItem);
                              
                              ocItem.SetCantRecepcion(_db);


                          }
                
                          

                       
                      }

                      _db.NotaIngresos.DeleteOnSubmit(ni);
                      _db.SubmitChanges();
                


                      result = true;
	        }

            ts.Complete();
            return result;
        }



        }


        public NotaIngresoInfo Load(int idNotaIngreso)
        {

            var q = from a in DbUtil.Db.NotaIngresos
                    where a.idInternal == idNotaIngreso
                    select new NotaIngresoInfo
                    {
                        descripcion = a.descripcion,
                        documentoRef = a.documentoRef,
                        documentoTipo = a.DocumentoTipo.abreviacion,
                        EmpleadoCre = a.Empleado.descripcion,
                        EmpleadoMod = a.Empleado1.descripcion,
                        fecha = a.fecha.Value,
                        fechaCre = a.fechaCre,
                        fechaMod = a.fechaMod,
                        fechaDoc=a.fechaDoc.Value,
                        idAlmacen = a.idAlmacen,
                        idDocumentoTipo = a.idDocumentoTipo,
                        idInternal = a.idInternal,
                        idMotivo = a.idMotivo,
                        idObra = a.idObra,
                        numDocumento = a.numDocumento,
                        observacion = a.observacion,
                        almacen=a.Almacen.descripcion,
                        motivo=a.MotivoItem.descripcion,
                        proveedor=a.Proveedor.descripcion,
                        tipoCambioDollar=a.tipoCambioDollar
                    };


            return q.First();


        }

        public NotaIngresoInfo LoadFromOrdComp(int idOrdenCompra)
        {
            //motivo compra de mercaderioa,
            string motivo = DbUtil.Db.MotivoItems.Single(p => p.idinternal == 1).descripcion;

            var q = from a in DbUtil.Db.OrdenCompras
                    where a.idInternal == idOrdenCompra
                    select new NotaIngresoInfo
                    {
                        descripcion = "Origen Orden Compra",
                        documentoRef = a.numDocumento,
                        //DocumentoTipo = ,
                        idDocumentoTipo = 13,//GUIA REMISION
                        //EmpleadoCre = a.Empleado.descripcion,
                        //EmpleadoMod = a.Empleado1.descripcion,
                        fecha = DateTime.Now,
                        fechaCre = DateTime.Now,
                        fechaMod = DateTime.Now,
                        idAlmacen = a.idAlmacen.Value,
                        idProveedor=a.idProveedor.Value,
                        proveedor=a.proveedor,
                        idInternal = 0,
                        idMotivo = 1, //Compra de  mercaderia
                        motivo=motivo,
                        idObra = a.idObra.Value,
                        //numDocumento = a.numDocumento,
                        //observacion = a.observacion
                    };
            
            return q.First();


        }

        #region Lista GET

        int _count;
        
        public int Count(int idObra,
                                                int motivo,
                                                string proveedor,
                                                string documento,
                                                DateTime fechaInicio, 
                                                DateTime fechaFin,
                                                int startRowIndex, 
                                                int maximumRows, 
                                                string sortExpression)
        {
            return _count;
        }

        public int Count(int idOrdenCompra,
                                                int startRowIndex,
                                                int maximumRows,
                                                string sortExpression)
        {
            return _count;
        }
        



        private IQueryable<NotaIngresoListInfo> ApplySort(IQueryable<NotaIngresoListInfo> q, string sortExpression)
        {
            switch (sortExpression)
            {
                case "descripcion":
                    q = q.OrderBy(b => b.descripcion);
                    break;
                case "descripcionRef DESC":
                    q = q.OrderByDescending(b => b.descripcionRef);
                    break;
                case "documentoRef":
                    q = q.OrderBy(b => b.documentoRef);
                    break;
                case "documentoRef DESC":
                    q = q.OrderByDescending(b => b.documentoRef);
                    break;
                case "documentoRefStr":
                    q = q.OrderBy(b => b.documentoRefStr);
                    break;
                case "documentoRefStr DESC":
                    q = q.OrderByDescending(b => b.documentoRefStr);
                    break;

                case "fecha":
                    q = q.OrderBy(b => b.documentoTipo);
                    break;
                case "fecha DESC":
                    q = q.OrderByDescending(b => b.fecha);
                    break;


                case "motivo":
                    q = q.OrderBy(b => b.motivo);
                    break;
                case "motivo DESC":
                    q = q.OrderByDescending(b => b.motivo);
                    break;


                case "numDocumento":
                    q = q.OrderBy(b => b.numDocumento);
                    break;
                case "numDocumento DESC":
                    q = q.OrderByDescending(b => b.numDocumento);
                    break;
                case "observacion":
                    q = q.OrderBy(b => b.observacion);
                    break;
                case "observacion DESC":
                    q = q.OrderByDescending(b => b.observacion);
                    break;

                default:
                    q = q.OrderByDescending(g=>g.numDocumento).OrderByDescending(b => b.fecha);
                    break;
            }
            return q;
        }


        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<NotaIngresoListInfo> GetNotaIngresoList(
                                                int idObra,
                                                int motivo,
                                                string proveedor,
                                                string documento,
                                                DateTime fechaInicio, 
                                                DateTime fechaFin,
                                                int startRowIndex, 
                                                int maximumRows, 
                                                string sortExpression)
                                               {

                                                   if (!documento.HasValue())
                                                       documento = "";

                                                   if (!proveedor.HasValue())
                                                       proveedor = "";


            


            var q = (from a in DbUtil.Db.NotaIngresoItems
                    where a.NotaIngreso.idObra == idObra
                     & a.NotaIngreso.fecha >= fechaInicio & a.NotaIngreso.fecha < fechaFin.AddDays(1)
                     & (motivo == 0 ? a.NotaIngreso.idMotivo != 0 : a.NotaIngreso.idMotivo == motivo)
                     & a.NotaIngreso.numDocumento.Contains(documento)
                    select new NotaIngresoListInfo
                    {
                        descripcion=a.NotaIngreso.descripcion,
                        descripcionRef=a.descripcionRef,
                        documentoRef=a.NotaIngreso.documentoRef,
                        documentoTipo=a.NotaIngreso.DocumentoTipo.abreviacion,
                        EmpleadoCre=a.NotaIngreso.Empleado.descripcion,
                        EmpleadoMod=a.NotaIngreso.Empleado1.descripcion,
                        fecha=a.NotaIngreso.fecha.Value,
                        fechaStr = a.NotaIngreso.fecha.Value.ToShortDateString(),
                        fechaCre=a.NotaIngreso.fechaCre,
                        fechaMod=a.NotaIngreso.fechaMod,
                        idAlmacen=a.NotaIngreso.idAlmacen,
                        idDocumentoTipo=a.NotaIngreso.idDocumentoTipo,
                        idInternal=a.NotaIngreso.idInternal,
                        idMotivo=a.NotaIngreso.idMotivo,
                        idObra=a.NotaIngreso.idObra,
                        numDocumento=a.NotaIngreso.numDocumento,
                        observacion=a.NotaIngreso.observacion,
                        motivo=a.NotaIngreso.MotivoItem.descripcion,
                        proveedor=(a.NotaIngreso.idProveedor==null?"":a.NotaIngreso.Proveedor.descripcion)      ,
                        formulario=string.Format("javascript:loadTabFromForm('tab{0}-{1}','{2}','{3}?id={4}&idAlmacen={1}&idObra={5}');",
                                notaIngresoRead.idAplicacion,
                                a.NotaIngreso.idAlmacen,
                                a.NotaIngreso.Almacen.descripcion,
                                notaIngresoRead.url,
                                a.NotaIngreso.idInternal,
                                a.NotaIngreso.idObra)
                    }).Where(p => p.proveedor.Contains(proveedor)).Distinct();

            _count = q.Count();
            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows);
        }




        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<NotaIngresoListInfo> GetNotaIngresoList(
                                                int idOrdenCompra,
                                                int startRowIndex,
                                                int maximumRows,
                                                string sortExpression)
        {

            var r = from a in DbUtil.Db.OrdenCompraItems
                    where a.idOrdenCompra == idOrdenCompra
                    select a.idInternal;
           

            var q = (from a in DbUtil.Db.NotaIngresoItems
                     where r.Contains(a.idRefItem.Value )
                     & a.idOrigen==1
                     & a.idRefItem!=null
                     select new NotaIngresoListInfo
                     {
                         descripcion = a.NotaIngreso.descripcion,
                         descripcionRef = a.descripcionRef,
                         documentoRef = a.NotaIngreso.documentoRef,
                         documentoTipo = a.NotaIngreso.DocumentoTipo.abreviacion,
                         EmpleadoCre = a.NotaIngreso.Empleado.descripcion,
                         EmpleadoMod = a.NotaIngreso.Empleado1.descripcion,
                         fecha = a.NotaIngreso.fecha.Value,
                         fechaStr = a.NotaIngreso.fecha.Value.ToShortDateString(),
                         fechaCre = a.NotaIngreso.fechaCre,
                         fechaMod = a.NotaIngreso.fechaMod,
                         idAlmacen = a.NotaIngreso.idAlmacen,
                         idDocumentoTipo = a.NotaIngreso.idDocumentoTipo,
                         idInternal = a.NotaIngreso.idInternal,
                         idMotivo = a.NotaIngreso.idMotivo,
                         idObra = a.NotaIngreso.idObra,
                         numDocumento = a.NotaIngreso.numDocumento,
                         observacion = a.NotaIngreso.observacion,
                         motivo = a.NotaIngreso.MotivoItem.descripcion,
                         proveedor = (a.NotaIngreso.idProveedor == null ? "" : a.NotaIngreso.Proveedor.descripcion),
                         formulario=string.Format("javascript:loadTabFromForm('tab{0}-{1}','{2}','{3}?id={4}&idAlmacen={1}&idObra={5}');",
                                notaIngresoRead.idAplicacion,
                                a.NotaIngreso.idAlmacen,
                                a.NotaIngreso.Almacen.descripcion,
                                notaIngresoRead.url,
                                a.NotaIngreso.idInternal,
                                a.NotaIngreso.idObra)
                     }).Distinct();

            _count = q.Count();
            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows);
        }

 #endregion





        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public List<NotaIngresoListInfo> GetNotaIngresoListXOrdenCompra(int idOrdenCompra)
        {

           

             var q = (from a in DbUtil.Db.NotaIngresoItems
                    join b in DbUtil.Db.OrdenCompraItems on  a.idRefItem equals b.idInternal into viewOrdenComp
                    from c in viewOrdenComp.DefaultIfEmpty()
                    where a.idOrigen==1 & c.idOrdenCompra==idOrdenCompra
                     select new NotaIngresoListInfo
                     {
                         descripcion = a.NotaIngreso.descripcion,
                         descripcionRef = a.descripcionRef,
                         documentoRef = a.NotaIngreso.documentoRef,
                         documentoTipo = a.NotaIngreso.DocumentoTipo.abreviacion,
                         EmpleadoCre = a.NotaIngreso.Empleado.descripcion,
                         EmpleadoMod = a.NotaIngreso.Empleado1.descripcion,
                         fecha = a.NotaIngreso.fecha.Value,
                         fechaCre = a.NotaIngreso.fechaCre,
                         fechaDoc = a.NotaIngreso.fechaDoc.Value,
                         fechaMod = a.NotaIngreso.fechaMod,
                         idAlmacen = a.NotaIngreso.idAlmacen,
                         idDocumentoTipo = a.NotaIngreso.idDocumentoTipo,
                         idInternal = a.NotaIngreso.idInternal,
                         idMotivo = a.NotaIngreso.idMotivo,
                         idObra = a.NotaIngreso.idObra,
                         numDocumento = a.NotaIngreso.numDocumento,
                         observacion = a.NotaIngreso.observacion,
                         motivo = a.NotaIngreso.MotivoItem.descripcion,
                         documentoRefStr=String.Format("{0} {1}",a.NotaIngreso.DocumentoTipo.abreviacion, a.NotaIngreso.documentoRef)
                     }).Distinct();

            return q.ToList();
        }


        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public List<NotaIngresoItemInfo> GetNotaIngresoItem(int idNotaIngreso,int idOrigen)
        {




            var q = (idOrigen != 13) ?
                       from a in DbUtil.Db.NotaIngresoItems
                       where a.idNotaIngreso == idNotaIngreso
                       select new NotaIngresoItemInfo(a.idInternal,
                           a.idNotaIngreso.Value,
                           a.idInsumo,
                           a.Insumo.codigo,
                           a.Insumo.descripcion,
                           a.Insumo.InsumoUnidad.abreviacion,
                           a.cantidad.Value,
                           a.cantidadOrig.Value,
                           a.idRefItem,
                           a.idOrigen,
                           a.descripcionRef,
                           a.precioUnit.Value,
                           a.idMoneda.Value,
                           a.idRefItem, // si es null no aparace como enlace;
                           a.NotaIngreso.idObra,
                           a.idRefNotaItem,
                           string.Format("javascript:loadTabFromForm('tab{0}-{1}','{2}','{3}?id={4}&idObra={1}');",
                                           ordenCompraRead.idAplicacion,
                                           a.NotaIngreso.idObra,
                                           a.NotaIngreso.Obra.descripcion,
                                           a.idRefItem != null ?
                                                       (a.OrdenCompraItem.OrdenCompra.idTipoOrden == 1 ? ordenCompraRead.url :
                                                                                                   ordenGastoRead.url)
                                                       : "",
                                           a.idRefItem != null ? a.OrdenCompraItem.idOrdenCompra.ToString() : "")
                           ) :
                       from a in DbUtil.Db.NotaIngresoItems
                       where a.idNotaIngreso == idNotaIngreso
                       select new NotaIngresoItemInfo(a.idInternal,
                               a.idNotaIngreso.Value,
                               a.idInsumo,
                               a.Insumo.codigo,
                               a.Insumo.descripcion,
                               a.Insumo.InsumoUnidad.abreviacion,
                               a.cantidad.Value,
                               a.cantidadOrig.Value,
                               a.idRefItem,
                               a.idOrigen,
                               a.descripcionRef,
                               a.precioUnit.Value,
                               a.idMoneda.Value,
                               a.idRefItem, // si es null no aparace como enlace;
                               a.NotaIngreso.idObra,
                               a.idRefNotaItem,
                               ""
                   );
                        
                        
                        // verificar si las notas de ingreso siempre sera de la misma obra
                              //
            return q.ToList();
        }

        
        //public NotaIngresoItemInfo LoadNotaIngresoItemOrigen(int idNotaIngresoItem)
        //{
        //    var q = from a in DbUtil.Db.NotaIngresoItems
        //            join b in DbUtil.Db.OrdenCompraItems on  a.idRefItem equals b.idInternal into viewOrdenComp
        //            from c in viewOrdenComp.DefaultIfEmpty()
        //            where a.idInternal == idNotaIngresoItem
        //            select new NotaIngresoItemInfo(a.idInternal,
        //                a.idNotaIngreso.Value,
        //                a.idInsumo,
        //                a.Insumo.codigo,
        //                a.Insumo.descripcion,
        //                a.Insumo.InsumoUnidad.abreviacion,
        //                a.cantidad.Value,
        //                c.cantidad.Value-c.cantidadRecep.Value+a.cantidad.Value,
        //                a.idRefItem,
        //                a.idOrigen,
        //                a.descripcionRef,
        //                a.precioUnit.Value,
        //                a.idMoneda.Value,
        //                c.idOrdenCompra,
        //                c.OrdenCompra.idObra,
        //                a.idOrigen==1? string.Format("javascript:loadTabFromForm('tab{0}-{1}','{2}','{3}?id={4}&idAlmacen={1}&idObra={5}');",
        //                        notaIngresoRead.idAplicacion,
        //                        a.NotaIngreso.idAlmacen,
        //                        a.NotaIngreso.Almacen.descripcion,
        //                        notaIngresoRead.url,
        //                        a.NotaIngreso.idInternal,
        //                        a.NotaIngreso.idObra):"");

        //            return q.First();
        //}

        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public List<NotaIngresoItemInfo> GetNotaIngresoItemFromOrdComp(int idOrdenCompra)
        {
            string DES = DbUtil.Db.DocumentoTipos.Single(p => p.idInternal == 14).abreviacion;
            //para  el caso de precio Unit de la nota de ingreso , este debe ser de la fecha del comparativo.
            //DateTime fechaComp=DbUtil.Db.OrdenCompras.Single(p=>p.idInternal==idOrdenCompra).Comparativo.fecha.Value;


            var q = from a in DbUtil.Db.OrdenCompraItems
                    where a.idOrdenCompra == idOrdenCompra &
                    (a.cantidad-a.cantidadRecep)>0 &
                    a.Insumo.bitControlStock==true
                    select a;

            List<NotaIngresoItemInfo> list = new List<NotaIngresoItemInfo>();
            foreach (var a in q)
            {
               
               string descripcionRef = String.Format("{0}  {1}" ,DES,a.OrdenCompra.numDocumento);
               int id = Parametros.GenerarID();
               NotaIngresoItemInfo info =new NotaIngresoItemInfo(id,0,
                                    a.Insumo.idInternal,
                                    a.Insumo.codigo,
                                    a.Insumo.descripcion,
                                    a.Insumo.InsumoUnidad.abreviacion,
                                    a.cantidad.Value - a.cantidadRecep.Value,
                                    a.cantidad.Value-a.cantidadRecep.Value,
                                    a.idInternal,
                                    1,
                                    descripcionRef,
                                    a.precioNoIGV.Value,
                                    a.OrdenCompra.idMoneda.Value,
                                    a.OrdenCompra.idInternal,
                                    a.OrdenCompra.idObra.Value,
                                    null,
                                    string.Format("javascript:loadTabFromForm('tab{0}-{1}','{2}','{3}?id={4}&idObra={1}');",
                                                ordenCompraRead.idAplicacion,
                                                a.OrdenCompra.idObra,
                                                a.OrdenCompra.Obra.descripcion,
                                                ordenCompraRead.url,
                                                a.idOrdenCompra)
                                    );
                        list.Add(info);
            }


            return list;
        }

        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public List<NotaIngresoItemInfo> GetNotaIngresoItemFromNotaSalida(int idNotaSalida)
        {
            string DES = DbUtil.Db.DocumentoTipos.Single(p => p.idInternal == 15).abreviacion;
            //para  el caso de precio Unit de la nota de ingreso , este debe ser de la fecha del comparativo.
            //DateTime fechaComp=DbUtil.Db.OrdenCompras.Single(p=>p.idInternal==idOrdenCompra).Comparativo.fecha.Value;


            var q = from a in DbUtil.Db.NotaSalidaItems
                    where a.idNotaSalida == idNotaSalida &
                    (a.cantidad - a.cantidadRecep) > 0 &
                    a.Insumo.bitControlStock == true
                    select a;

            List<NotaIngresoItemInfo> list = new List<NotaIngresoItemInfo>();
            foreach (var a in q)
            {

                string descripcionRef = String.Format("{0}  {1}", DES, a.NotaSalida.numDocumento);
                int id = Parametros.GenerarID();
                NotaIngresoItemInfo info = new NotaIngresoItemInfo(id, 0,
                                     a.Insumo.idInternal,
                                     a.Insumo.codigo,
                                     a.Insumo.descripcion,
                                     a.Insumo.InsumoUnidad.abreviacion,
                                     a.cantidad - a.cantidadRecep,
                                     a.cantidad - a.cantidadRecep,
                                     a.idInternal,
                                     13, /// 1=ordenCompra, 13==ingreso x trasferencia
                                     descripcionRef,
                                     0,
                                     3,
                                     null,
                                     a.NotaSalida.idObra,
                                     a.idInternal,
                                     ""
                                     );
                list.Add(info);
            }


            return list;
        }

    
    
    }




}
